Loading Libraries

# load libraries

library(quanteda)
library(readtext)
library(wordcloud)
library(RColorBrewer)
library(wordcloud2)
library(tidyverse)
library(tm)
library("textcat")
library("quanteda.textplots")
library("quanteda.textstats")
library("gsubfn")
library("spacyr")

spacy_initialize(model = "de_core_news_sm")

Start here to load existing corpora:

# load corpus files 
full_corpus = readRDS("corpora/full_corpus.rds")
full_corpus_sents = readRDS("corpora/full_corpus_sents.rds")

pro_corpus = readRDS("corpora/pro_corpus.rds")
contra_corpus = readRDS("corpora/contra_corpus.rds")

pro2000 = readRDS("corpora/pro2000.rds")
pro900 = readRDS("corpora/pro900.rds")
contra2000 = readRDS("corpora/contra2000.rds")
contra900 = readRDS("corpora/contra900.rds")

fff_de_corpus = readRDS("corpora/fff_de_corpus.rds")
ikem_corpus = readRDS("corpora/ikem_corpus.rds")
klimarep_corpus = readRDS("corpora/klimarep_corpus.rds")
klimafakten_corpus = readRDS("corpora/klimafakten_corpus.rds")
zero_corpus = readRDS("corpora/zero_corpus.rds")
komma_corpus = readRDS("corpora/komma_corpus.rds")
eike_corpus = readRDS("corpora/eike_corpus.rds")
ffh_corpus = readRDS("corpora/ffh_corpus.rds")

Exploring the corpus

Corpus statistics

# to get index number 
#id_pro = 1:ndoc(pro900)

Plotting Number of Sentences

pro2000_sum <- summary(pro2000, ndoc(pro2000))
contra2000_sum <- summary(contra2000)
pro900_sum <- summary(pro900, ndoc(pro900))
contra900_sum <- summary(contra900, ndoc(contra900))

#to get id as x axis
#id_pro[1:100]
#contra900_sum$id

ggplot(pro2000_sum, aes(id, Sentences, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Sentences Pro2000")


ggplot(contra2000_sum, aes(id, Sentences, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Sentences Contra2000")

pro900_sum <- summary(pro900, n=100)
contra900_sum <- summary(contra900, n=100)


ggplot(pro900_sum, aes(pro900_sum$id, Tokens, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Tokens Pro900")


ggplot(contra900_sum, aes(contra900_sum$id, Tokens, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Tokens Contra900")

ggplot(pro900_sum, aes(pro900_sum$id, Types, group=1)) + 
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Types Pro900")


ggplot(contra900_sum, aes(contra900_sum$id, Types, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Types Contra900")

NA
NA
ggplot(pro900_sum, aes(Tokens, Types, group=1, label= id)) +
  geom_smooth(method = "lm", formula ="y ~ x", se = FALSE) +
  geom_text(check_overlap = T) +
  ggtitle("Type-Token-Relation Pro900")


ggplot(contra900_sum, aes(Tokens, Types, group=1, label= id)) +
  geom_smooth(method = "lm", formula ="y ~ x", se = FALSE) +
  geom_text(check_overlap = T) +
  ggtitle("Type-Token-Relation Contra900")

<<<<<<< Updated upstream # Word Frequencies

1. Step: Create DFM, Load Stoplists

# stoplists
de_stopwords <- stopwords::stopwords("de", source="snowball")
en_stopwords <- stopwords::stopwords("en", source="snowball" )
custom_stopwords <- read.table("de_complete.txt", header=F, sep="\n")



# add own stopwords 
full_stopwords <- c(de_stopwords, "dass", "=", "the", "seit", "ab", "beim", "\n", "mal", "c", "|", "m", "kommentare", "neueste", "gepostet", custom_stopwords, en_stopwords)
de_stopwords1 <- c(de_stopwords, "dass", "=", "the", "seit", "ab", "beim", "\n", "mal", "c", "\\|","|", "m", "kommentare", "neueste", "gepostet", "admin", "cookies", "inhalte", "inhalt", "newsletter", "posten", "zugriff", "passwort", "geschützt", "seite", "website", "webseite", "and", "0", "1", "2", "3","4","5","6","7","8","9", "mfg","w","t","wer")

# create dfm
dfm_p2000 <- dfm(pro2000, remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
dfm_c2000 <- dfm(contra2000, remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead

Corpus Cleaning: Lemmatization -> new lemmatized dfm

# pro 
sp_pro2000 <- spacy_parse(pro2000, pos=FALSE, entity=FALSE, dependency=FALSE)
Warnung in spacy_parse.character(pro2000, pos = FALSE, entity = FALSE, dependency = FALSE)
  lemmatization may not work properly in model 'de_core_news_sm'
sp_pro2000$token <- sp_pro2000$lemma

sp_dfm_p2000 <- as.tokens(sp_pro2000)%>%
  dfm(remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE, tolower=TRUE)
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
# contra
sp_contra2000 <- spacy_parse(contra2000, pos=FALSE, entity=FALSE, dependency=FALSE)
Warnung in spacy_parse.character(contra2000, pos = FALSE, entity = FALSE, 
  lemmatization may not work properly in model 'de_core_news_sm'
sp_contra2000$token <- sp_contra2000$lemma

sp_dfm_c2000 <- as.tokens(sp_contra2000)%>%
  dfm(remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE, tolower=TRUE)
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
dfm_p2000
Document-feature matrix of: 2,000 documents, 60,243 features (99.72% sparse) and 4 docvars.
                  features
docs               klima update ° folge extremwetter eu-klimaplan versicherungswende wütet weltweit eu-kommission
  kr_00007.txt         3      3 3     1            3            1                  1     2        2             1
  ikem_01141.txt       0      0 0     0            0            0                  0     0        0             0
  fff_de_00121.txt     0      0 0     0            0            0                  0     0        0             0
  ikem_00898.txt       0      0 0     0            0            0                  0     0        0             0
  ikem_00709.txt       0      0 0     0            0            0                  0     0        0             0
  ikem_00588.txt       0      0 0     0            0            0                  0     0        0             0
[ reached max_ndoc ... 1,994 more documents, reached max_nfeat ... 60,233 more features ]
dfm_c2000
Document-feature matrix of: 2,000 documents, 150,974 features (99.71% sparse) and 4 docvars.
                features
docs             interne ermittler schule glauben ehemalige labortechnikerin erin potts-kant daten medizinische
  eike_05241.txt       1         1      2       1         2                1    1          6     7            1
  eike_07670.txt       0         0      0       0         0                0    0          0     0            0
  eike_12660.txt       0         0      0       0         0                0    0          0     0            0
  eike_13073.txt       0         0      0       0         0                0    0          0     0            0
  eike_09381.txt       0         0      0       0         0                0    0          0     0            0
  eike_05930.txt       0         0      0       0         0                0    0          0     0            0
[ reached max_ndoc ... 1,994 more documents, reached max_nfeat ... 150,964 more features ]

2. Step: Check Topfeatures of DFM -> most frequently occuring terms

topfeatures(sp_dfm_p2000, n=50)
        mehr          uhr         ikem       mensch         jahr         weit  deutschland        geben      energie        thema      aktuell 
        4283         3497         2657         2464         2062         1698         1645         1602         1592         1402         1362 
      sollen         groß        gehen  klimaschutz          gut        sowie        immer      bleiben  information       müssen        schon 
        1323         1319         1301         1289         1276         1207         1156         1152         1151         1144         1084 
       dabei       future       arbeit       stehen energiewende      politik       finden        welch         land      projekt         ziel 
        1020          992          977          926          901          895          891          886          876          869          863 
     wichtig       berlin       kommen      fridays     erfahren          jed      zukunft   klimakrise   newsletter         ganz          neu 
         851          846          838          831          825          816          813          796          780          769          750 
      rahmen     laufende      möglich         erst     anmelden        frage 
         748          741          735          721          720          717 
topfeatures(sp_dfm_c2000, n=50)
       jahr       geben        mehr       schon       immer         co2         gut      kommen          ja       gehen        weit deutschland 
       9197        6646        6328        4722        4289        4114        4067        4056        3951        3821        3786        3643 
     sollen      mensch       sagen        groß       welch         jed      zeigen     energie        hoch       wenig        ganz      global 
       3640        3559        3448        3378        3332        3286        3102        2921        2883        2869        2834        2523 
      sehen      müssen  temperatur       strom        herr   natürlich      stehen     einfach           °        zeit       klima        erst 
       2503        2480        2423        2399        2381        2236        2234        2226        2221        2215        2196        2154 
     finden       heute       frage        land klimawandel      liegen        etwa   erwärmung       genau      wissen        erde        welt 
       2121        2064        2048        2001        1944        1912        1901        1856        1852        1852        1824        1822 
 atmosphäre         tun 
       1808        1804 
tf_p2000 <- topfeatures(sp_dfm_p2000, n=50)
tf_c2000 <- topfeatures(sp_dfm_c2000, n=50)
textstat_frequency(sp_dfm_p2000, n=50)

Plotting word frequencies

klima_p2000 <- dfm_select(sp_dfm_p2000, pattern="klima*")
klima_c2000 <- dfm_select(sp_dfm_c2000, pattern="klima*")
topfeatures(klima_p2000, n=50)
                klimaschutz                  klimakrise             klimapolitische 
                       1289                         796                         705 
                klimawandel                       klima                klimapolitik 
                        671                         638                         277 
         klimagerechtigkeit                  klimaziele                 klimastreik 
                        239                         224                         200 
               klimawandels                klimaneutral            klimaneutralität 
                        170                         150                         128 
                     klima-               klimaabkommen           klimafinanzierung 
                        118                         102                          99 
              klimareporter        klimaschutzmaßnahmen           klimaschutzgesetz 
                         94                          94                          91 
           klimaschutzziele            klimakatastrophe               klimanotstand 
                         84                          80                          67 
                  klimacamp                  klimapaket               klimagerechte 
                         65                          63                          58 
         klimakommunikation            klimaschädlichen               klimaschutzes 
                         48                          47                          46 
           klimafreundliche              klimafakten.de             klimaschädliche 
                         43                          41                          39 
klimagerechtigkeitsbewegung               klimabewegung               klimaneutrale 
                         38                          38                          38 
                  klimaplan                 klimawissen            klimakonferenzen 
                         37                          36                          36 
               klimastreiks          klimaschutzpolitik               klimaforscher 
                         36                          36                          35 
             klimaabkommens              klimaerwärmung                   klimawahl 
                         35                          32                          31 
           klimapolitischen              klimaneutralen              klimakonferenz 
                         31                          29                          29 
                klimazielen                   klimaziel           klimafreundlichen 
                         29                          27                          26 
             klimaforschung                 klimagesetz 
                         25                          24 
topfeatures(klima_c2000, n=50)
               klima          klimawandel         klimawandels          klimaschutz 
                2196                 1944                  492                  443 
        klimamodelle    klimawissenschaft        klimaforscher         klimapolitik 
                 278                  198                  176                  158 
    klimakatastrophe       klimaerwärmung klimawissenschaftler    klimasensitivität 
                 157                  149                  135                  123 
       klimamodellen       klimaforschung         klimaleugner               klima- 
                 115                  108                  105                   94 
          klimakrise      klimaänderungen       klimaskeptiker          klimaretter 
                  87                   83                   82                   78 
       klimahysterie         klimatologie        klimaabkommen      klimaalarmisten 
                  67                   67                   57                   57 
         klimasystem           klimatisch         klimatologen     klima-alarmisten 
                  57                   55                   55                   54 
     klimaaktivisten          klimagipfel klimafolgenforschung           klimaziele 
                  50                   50                   46                   46 
        klimarettung         klimaneutral     klimaretter.info    klimaschwankungen 
                  45                   42                   42                   41 
       klimaänderung       klimakonferenz          klimatische        klimaschützer 
                  41                   40                   39                   36 
        klimadebatte        klimareligion           klimadaten     klimaflüchtlinge 
                  35                   35                   35                   33 
  klimaveränderungen        klimaschutzes          klimamodell        klimaexperten 
                  31                   30                   30                   29 
         klimakirche         klimasystems 
                  29                   29 
freq_p2000 <- textstat_frequency(sp_dfm_p2000, n=50)
freq_c2000 <- textstat_frequency(sp_dfm_c2000, n=50)

plot_p2000 <- with(freq_p2000, reorder(feature, -frequency))
plot_c2000 <- with(freq_c2000, reorder(feature, -frequency))

#create plot for eike klima words frequencies
plot1 <- ggplot(freq_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot1


#create plot for klimareporter klima words frequencies
plot2 <- ggplot(freq_c2000, aes(x=feature, y=frequency)) + 
  geom_point()+ ggtitle("C2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1)) 
  
#ggsave(plot=plot2, width = 10, height = 5, dpi=300, filename="klima_klimarep_plot.jpeg" )
plot2

Same Plot for “Klima” Words

freq_klima_p2000 <- textstat_frequency(klima_p2000, n=50)
freq_klima_c2000 <- textstat_frequency(klima_c2000, n=50)

freq_klima_p2000$feature <- with(freq_klima_p2000, reorder(feature, -frequency))
freq_klima_c2000$feature <- with(freq_klima_c2000, reorder(feature, -frequency))

#create plot for eike klima words frequencies
plot1 <- ggplot(freq_klima_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Klima Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot1


#create plot for klimareporter klima words frequencies
plot2 <- ggplot(freq_klima_c2000, aes(x=feature, y=frequency)) + 
  geom_point()+ ggtitle("C2000 Klima Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1)) 
  
#ggsave(plot=plot2, width = 10, height = 5, dpi=300, filename="klima_klimarep_plot.jpeg" )
plot2

# to save lists of klima-words 
# w/o "$feature" it saves the whole table as text file (with frequency info etc.)
#capture.output(list(freq_klima_p2000$feature), file = "terms_pro.txt")
#capture.output(list(freq_klima_c2000$feature), file = "terms_contra.txt")

Plot TF-IDF (not working yet!!!)

# weighted words
p2000_weight <- dfm_weight(sp_dfm_p2000, scheme="prop")
c2000_weight <- dfm_weight(sp_dfm_c2000, scheme="prop")

relfreq_p2000 <- textstat_frequency(p2000_weight, n=50)
relfreq_c2000 <- textstat_frequency(c2000_weight, n=50)

#tfidf
p2000_tfidf <- dfm_tfidf(sp_dfm_p2000)
c2000_tfidf <- dfm_tfidf(sp_dfm_c2000)

#plot3 <- with(relfreq_p2000, reorder(feature, -freqency))
relfreq_p2000$feature <- with(relfreq_p2000, reorder(feature, -frequency))
plot3 <- ggplot(relfreq_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot3

pro_freq_tfidf <- p2000_tfidf %>%
  textstat_frequency(n=10, force=TRUE)

con_freq_tfidf <- c2000_tfidf %>%
  textstat_frequency(n=10, force=TRUE)

tplot_tfidf_p2000 <- ggplot(data=pro_freq_tfidf,
                      aes(x=factor(nrow(pro_freq_tfidf):1),
                          y=frequency)) +
  geom_point() +
  coord_flip() +
  scale_x_discrete(breaks=factor(nrow(pro_freq_tfidf):1),
                   labels=pro_freq_tfidf$feature) +
  labs(x=NULL, y="tf-idf")

tplot_tfidf_p2000


tplot_tfidf_c2000 <- ggplot(data=con_freq_tfidf,
                      aes(x=factor(nrow(con_freq_tfidf):1),
                          y=frequency)) +
  geom_point() +
  coord_flip() +
  scale_x_discrete(breaks=factor(nrow(con_freq_tfidf):1),
                   labels=con_freq_tfidf$feature) +
  labs(x=NULL, y="tf-idf")

tplot_tfidf_c2000

topfeatures(p2000_tfidf, n=20)
        uhr      infos|        jahr     cookies     energie       geben        mehr        weit         gut      sollen 
  3974.9600   1661.5255   1179.1861   1053.8321   1004.2084    964.5001    930.1357    920.5165    904.4967    869.9748 
      gehen deutschland       schon       immer        groß       12:00      müssen       sowie      future klimaschutz 
   867.1851    864.9142    852.5468    824.5968    823.4997    818.0000    786.1433    774.9726    764.6637    759.5081 
topfeatures(c2000_tfidf, n=20)
       jahr         co2       geben        mehr          ja           °       strom       schon  temperatur deutschland 
   2420.699    2202.477    1859.821    1802.421    1683.002    1667.530    1630.969    1585.781    1569.662    1547.591 
       herr  atmosphäre       immer      mensch         gut           w       gehen      zeigen      kommen      global 
   1458.625    1402.981    1394.521    1381.877    1361.991    1328.953    1312.218    1296.439    1287.389    1285.063 
#p2000_weight

#textstat_frequency(p2000_tfidf, n=10)

Comparison of Groups/Origin

Collocations

# to remove special chars from corpus
pro2000 <- gsub("\\|", "", pro2000)
pro2000 <- gsub("=", "", pro2000)

# convert into collocation dataframe
p_coll <- textstat_collocations(pro2000, min_count=50)
arrange(p_coll, desc(count))
# transform stoplists for dplyr::filter function (why?)
de_stps <- paste0(de_stopwords, collapse = "\\b|\\b")
en_stps <- paste0(en_stopwords, collapse = "\\b|\\b")

# remove entries involving stopwords: NOT WORKING YET!
p2000_coll_clean <- p_coll %>%
  dplyr::filter(!str_detect(collocation, de_stps),
                !str_detect(collocation, en_stps),
                !str_detect(collocation, "="))

#p2000_coll_clean
arrange(p2000_coll_clean, desc(count))
# collocations mit vorherigem stopwords removal
p2000_toks <- tokens(pro2000)
p2000_toks_sw <- tokens_select(p2000_toks, pattern=full_stopwords, selection="remove")

p2000_coll <- textstat_collocations(p2000_toks_sw, min_count=3)
arrange(p2000_coll, desc(count))
summary(full_corpus, n=5)
Corpus consisting of 4000 documents, showing 5 documents:

             Text Types Tokens Sentences origin language     group
     kr_00007.txt   196    284        19     kr   german activists
   ikem_01141.txt    27     30         2   ikem   german activists
 fff_de_00121.txt   105    178        11 fff_de   german activists
   ikem_00898.txt   211    880        32   ikem   german activists
   ikem_00709.txt    20     43         3   ikem   german activists

Comparison Plots

ggplot(freqs) +
  geom_segment(aes(x=feature, xend=feature, y=frequency.x, yend=frequency.y), color="grey") +
  geom_point(aes(x=feature, y=frequency.x), color = "red", size = 3 ) +
  geom_point(aes(x=feature, y=frequency.y), color = "lightblue", size = 3 ) +
  ggtitle("Word Frequencies") + 
  xlab("") + ylab("Wortfrequenz") + 
  coord_flip()
Warnung: Removed 1 rows containing missing values (geom_segment).
Warnung: Removed 1 rows containing missing values (geom_point).

p+labs(colour="Group")
Warnung: Removed 1 rows containing missing values (geom_segment).
Warnung: Removed 1 rows containing missing values (geom_point).

as.tokens(sp_pro2000) %>%
  dfm()
Document-feature matrix of: 2,000 documents, 54,656 features (99.63% sparse) and 0 docvars.
                  features
docs               klima update ° – folge 35 \n extremwetter  , eu-klimaplan
  kr_00007.txt         3      3 3 3     1  1  8            3  8            1
  ikem_01141.txt       0      0 0 0     0  0  2            0  1            0
  fff_de_00121.txt     0      0 0 0     0  0  6            0  9            0
  ikem_00898.txt       0      0 0 0     0  0 24            0 28            0
  ikem_00709.txt       0      0 0 0     0  0 12            0  0            0
  ikem_00588.txt       0      0 0 3     0  0 45            0 42            0
[ reached max_ndoc ... 1,994 more documents, reached max_nfeat ... 54,646 more features ]
dfm_weight_corp <- full_corpus %>%
  tokens(remove_punct = TRUE) %>%
  tokens_remove(de_stopwords1) %>%
  dfm() %>%
  dfm_weight(scheme = "prop")

# Calculate relative frequency by president
freq_weight <- textstat_frequency(dfm_weight_corp, n = 10, 
                                  groups = dfm_weight_corp$origin)

ggplot(data = freq_weight, aes(x = nrow(freq_weight):1, y = frequency)) +
     geom_point() +
     facet_wrap(~ group, scales = "free") +
     coord_flip() +
     scale_x_continuous(breaks = nrow(freq_weight):1,
                        labels = freq_weight$feature) +
     labs(x = NULL, y = "Relative frequency")

summary(full_corpus, n=10)

Keyness

Comparison Cloud

full_corpus %>%
    tokens(remove_punct = TRUE, remove_numbers=TRUE) %>%
    tokens_remove(de_stopwords1) %>%
    dfm() %>%
    dfm_group(groups = group) %>%
    dfm_trim(min_termfreq = 5, verbose = FALSE) %>%
    textplot_wordcloud(comparison = TRUE, max_words=100)

                       #,color=c("lightblue","blue"))
textplot_xray(
    kwic(tokens(pro2000), pattern = "klima*"),
    kwic(tokens(contra2000), pattern = "klima*"))

Topic Modeling

library(tidytext)
Fehler in library(tidytext) : es gibt kein Paket namens ‘tidytext’
dfm_full <- dfm(full_corpus, remove=de_stopwords1, remove_punct=TRUE, remove_numbers=TRUE)
dfm_full

tm_full<-convert(dfm_full, to="topicmodels")

topicModel <- LDA(tm_full, k=5, method="Gibbs", control=list(iter = 500, verbose = 25))
terms(topicModel, 10)

Ideas: DONE: Wordcloud Plot of Comparison Group: https://quanteda.io/articles/pkgdown/examples/plotting.html

Lexical Dispersion Plot (X-Ray) -> could be done for keywords "klima*"

Next: - Calculate “Corpus Similarity” - Klimawörter Liste mit Group und Counts abspeichern -> welche Klimawörter gibt es wo und wie oft - alles mit der “Sents” Version testen - Analyse der Ergebnisse - Literatur-Recherche zu den Textmining Themen

Topic Modeling https://www.tidytextmining.com/topicmodeling.html

LS0tCnRpdGxlOiAiRW1waXJpY2FsIFdvcmsgLSBDbGltYXRlIENoYW5nZSBEaXNjb3Vyc2UgQ29ycG9yYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgojIyBMb2FkaW5nIExpYnJhcmllcwoKYGBge3J9CiMgbG9hZCBsaWJyYXJpZXMKCmxpYnJhcnkocXVhbnRlZGEpCmxpYnJhcnkocmVhZHRleHQpCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeSh3b3JkY2xvdWQyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0bSkKbGlicmFyeSgidGV4dGNhdCIpCmxpYnJhcnkoInF1YW50ZWRhLnRleHRwbG90cyIpCmxpYnJhcnkoInF1YW50ZWRhLnRleHRzdGF0cyIpCmxpYnJhcnkoImdzdWJmbiIpCmxpYnJhcnkoInNwYWN5ciIpCgpzcGFjeV9pbml0aWFsaXplKG1vZGVsID0gImRlX2NvcmVfbmV3c19zbSIpCmBgYAoKIyMgU3RhcnQgaGVyZSB0byBsb2FkIGV4aXN0aW5nIGNvcnBvcmE6CgpgYGB7cn0KIyBsb2FkIGNvcnB1cyBmaWxlcyAKZnVsbF9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2Z1bGxfY29ycHVzLnJkcyIpCmZ1bGxfY29ycHVzX3NlbnRzID0gcmVhZFJEUygiY29ycG9yYS9mdWxsX2NvcnB1c19zZW50cy5yZHMiKQoKcHJvX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvcHJvX2NvcnB1cy5yZHMiKQpjb250cmFfY29ycHVzID0gcmVhZFJEUygiY29ycG9yYS9jb250cmFfY29ycHVzLnJkcyIpCgpwcm8yMDAwID0gcmVhZFJEUygiY29ycG9yYS9wcm8yMDAwLnJkcyIpCnBybzkwMCA9IHJlYWRSRFMoImNvcnBvcmEvcHJvOTAwLnJkcyIpCmNvbnRyYTIwMDAgPSByZWFkUkRTKCJjb3Jwb3JhL2NvbnRyYTIwMDAucmRzIikKY29udHJhOTAwID0gcmVhZFJEUygiY29ycG9yYS9jb250cmE5MDAucmRzIikKCmZmZl9kZV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2ZmZl9kZV9jb3JwdXMucmRzIikKaWtlbV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2lrZW1fY29ycHVzLnJkcyIpCmtsaW1hcmVwX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEva2xpbWFyZXBfY29ycHVzLnJkcyIpCmtsaW1hZmFrdGVuX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEva2xpbWFmYWt0ZW5fY29ycHVzLnJkcyIpCnplcm9fY29ycHVzID0gcmVhZFJEUygiY29ycG9yYS96ZXJvX2NvcnB1cy5yZHMiKQprb21tYV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2tvbW1hX2NvcnB1cy5yZHMiKQplaWtlX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvZWlrZV9jb3JwdXMucmRzIikKZmZoX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvZmZoX2NvcnB1cy5yZHMiKQpgYGAKCgoKIyBFeHBsb3JpbmcgdGhlIGNvcnB1cwoKIyMgQ29ycHVzIHN0YXRpc3RpY3MKCmBgYHtyfQojIHRvIGdldCBpbmRleCBudW1iZXIgCiNpZF9wcm8gPSAxOm5kb2MocHJvOTAwKSAKYGBgCgojIFBsb3R0aW5nIE51bWJlciBvZiBTZW50ZW5jZXMKCmBgYHtyfQpjb250cmEyMDAwX3N1bSA8LSBzdW1tYXJ5KGNvbnRyYTIwMDApCnBybzkwMF9zdW0gPC0gc3VtbWFyeShwcm85MDAsIG5kb2MocHJvOTAwKSkKY29udHJhOTAwX3N1bSA8LSBzdW1tYXJ5KGNvbnRyYTkwMCwgbmRvYyhjb250cmE5MDApKQoKI3RvIGdldCBpZCBhcyB4IGF4aXMKI2lkX3Byb1sxOjEwMF0KI2NvbnRyYTkwMF9zdW0kaWQKCmdncGxvdChwcm8yMDAwX3N1bSwgYWVzKGlkLCBTZW50ZW5jZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlNlbnRlbmNlcyBQcm8yMDAwIikKCmdncGxvdChjb250cmEyMDAwX3N1bSwgYWVzKGlkLCBTZW50ZW5jZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlNlbnRlbmNlcyBDb250cmEyMDAwIikKCmBgYAoKYGBge3J9CnBybzkwMF9zdW0gPC0gc3VtbWFyeShwcm85MDAsIG49MTAwKQpjb250cmE5MDBfc3VtIDwtIHN1bW1hcnkoY29udHJhOTAwLCBuPTEwMCkKCgpnZ3Bsb3QocHJvOTAwX3N1bSwgYWVzKHBybzkwMF9zdW0kaWQsIFRva2VucywgZ3JvdXA9MSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVG9rZW5zIFBybzkwMCIpCgpnZ3Bsb3QoY29udHJhOTAwX3N1bSwgYWVzKGNvbnRyYTkwMF9zdW0kaWQsIFRva2VucywgZ3JvdXA9MSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVG9rZW5zIENvbnRyYTkwMCIpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QocHJvOTAwX3N1bSwgYWVzKHBybzkwMF9zdW0kaWQsIFR5cGVzLCBncm91cD0xKSkgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVHlwZXMgUHJvOTAwIikKCmdncGxvdChjb250cmE5MDBfc3VtLCBhZXMoY29udHJhOTAwX3N1bSRpZCwgVHlwZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlR5cGVzIENvbnRyYTkwMCIpCgoKYGBgCgpgYGB7cn0KZ2dwbG90KHBybzkwMF9zdW0sIGFlcyhUb2tlbnMsIFR5cGVzLCBncm91cD0xLCBsYWJlbD0gaWQpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9InkgfiB4Iiwgc2UgPSBGQUxTRSkgKwogIGdlb21fdGV4dChjaGVja19vdmVybGFwID0gVCkgKwogIGdndGl0bGUoIlR5cGUtVG9rZW4tUmVsYXRpb24gUHJvOTAwIikKCmdncGxvdChjb250cmE5MDBfc3VtLCBhZXMoVG9rZW5zLCBUeXBlcywgZ3JvdXA9MSwgbGFiZWw9IGlkKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSJ5IH4geCIsIHNlID0gRkFMU0UpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcCA9IFQpICsKICBnZ3RpdGxlKCJUeXBlLVRva2VuLVJlbGF0aW9uIENvbnRyYTkwMCIpCmBgYAo8PDw8PDw8IFVwZGF0ZWQgdXBzdHJlYW0KIyBXb3JkIEZyZXF1ZW5jaWVzCgoKIyMgMS4gU3RlcDogQ3JlYXRlIERGTSwgTG9hZCBTdG9wbGlzdHMgCmBgYHtyfQojIHN0b3BsaXN0cwpkZV9zdG9wd29yZHMgPC0gc3RvcHdvcmRzOjpzdG9wd29yZHMoImRlIiwgc291cmNlPSJzbm93YmFsbCIpCmVuX3N0b3B3b3JkcyA8LSBzdG9wd29yZHM6OnN0b3B3b3JkcygiZW4iLCBzb3VyY2U9InNub3diYWxsIiApCmN1c3RvbV9zdG9wd29yZHMgPC0gcmVhZC50YWJsZSgiZGVfY29tcGxldGUudHh0IiwgaGVhZGVyPUYsIHNlcD0iXG4iKQoKCgojIGFkZCBvd24gc3RvcHdvcmRzIApmdWxsX3N0b3B3b3JkcyA8LSBjKGRlX3N0b3B3b3JkcywgImRhc3MiLCAiPSIsICJ0aGUiLCAic2VpdCIsICJhYiIsICJiZWltIiwgIlxuIiwgIm1hbCIsICJjIiwgInwiLCAibSIsICJrb21tZW50YXJlIiwgIm5ldWVzdGUiLCAiZ2Vwb3N0ZXQiLCBjdXN0b21fc3RvcHdvcmRzLCBlbl9zdG9wd29yZHMpCmRlX3N0b3B3b3JkczEgPC0gYyhkZV9zdG9wd29yZHMsICJkYXNzIiwgIj0iLCAidGhlIiwgInNlaXQiLCAiYWIiLCAiYmVpbSIsICJcbiIsICJtYWwiLCAiYyIsICJcXHwiLCJ8IiwgIm0iLCAia29tbWVudGFyZSIsICJuZXVlc3RlIiwgImdlcG9zdGV0IiwgImFkbWluIiwgImNvb2tpZXMiLCAiaW5oYWx0ZSIsICJpbmhhbHQiLCAibmV3c2xldHRlciIsICJwb3N0ZW4iLCAienVncmlmZiIsICJwYXNzd29ydCIsICJnZXNjaMO8dHp0IiwgInNlaXRlIiwgIndlYnNpdGUiLCAid2Vic2VpdGUiLCAiYW5kIiwgIjAiLCAiMSIsICIyIiwgIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCAibWZnIiwidyIsInQiLCJ3ZXIiKQoKIyBjcmVhdGUgZGZtCmRmbV9wMjAwMCA8LSBkZm0ocHJvMjAwMCwgcmVtb3ZlPWZ1bGxfc3RvcHdvcmRzLCByZW1vdmVfcHVuY3Q9VFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSkKZGZtX2MyMDAwIDwtIGRmbShjb250cmEyMDAwLCByZW1vdmU9ZnVsbF9zdG9wd29yZHMsIHJlbW92ZV9wdW5jdD1UUlVFLCByZW1vdmVfbnVtYmVycz1UUlVFKQpgYGAKCiMjIENvcnB1cyBDbGVhbmluZzogTGVtbWF0aXphdGlvbiAtPiBuZXcgbGVtbWF0aXplZCBkZm0KYGBge3J9CiMgcHJvIApzcF9wcm8yMDAwIDwtIHNwYWN5X3BhcnNlKHBybzIwMDAsIHBvcz1GQUxTRSwgZW50aXR5PUZBTFNFLCBkZXBlbmRlbmN5PUZBTFNFKQpzcF9wcm8yMDAwJHRva2VuIDwtIHNwX3BybzIwMDAkbGVtbWEKCnNwX2RmbV9wMjAwMCA8LSBhcy50b2tlbnMoc3BfcHJvMjAwMCklPiUKICBkZm0ocmVtb3ZlPWZ1bGxfc3RvcHdvcmRzLCByZW1vdmVfcHVuY3Q9VFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSwgdG9sb3dlcj1UUlVFKQoKIyBjb250cmEKc3BfY29udHJhMjAwMCA8LSBzcGFjeV9wYXJzZShjb250cmEyMDAwLCBwb3M9RkFMU0UsIGVudGl0eT1GQUxTRSwgZGVwZW5kZW5jeT1GQUxTRSkKc3BfY29udHJhMjAwMCR0b2tlbiA8LSBzcF9jb250cmEyMDAwJGxlbW1hCgpzcF9kZm1fYzIwMDAgPC0gYXMudG9rZW5zKHNwX2NvbnRyYTIwMDApJT4lCiAgZGZtKHJlbW92ZT1mdWxsX3N0b3B3b3JkcywgcmVtb3ZlX3B1bmN0PVRSVUUsIHJlbW92ZV9udW1iZXJzPVRSVUUsIHRvbG93ZXI9VFJVRSkKYGBgCgpgYGB7cn0KZGZtX3AyMDAwCmRmbV9jMjAwMApgYGAKCiMjIDIuIFN0ZXA6IENoZWNrIFRvcGZlYXR1cmVzIG9mIERGTSAtPiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgdGVybXMKYGBge3J9CnRvcGZlYXR1cmVzKHNwX2RmbV9wMjAwMCwgbj01MCkKdG9wZmVhdHVyZXMoc3BfZGZtX2MyMDAwLCBuPTUwKQpgYGAKCmBgYHtyfQp0Zl9wMjAwMCA8LSB0b3BmZWF0dXJlcyhzcF9kZm1fcDIwMDAsIG49NTApCnRmX2MyMDAwIDwtIHRvcGZlYXR1cmVzKHNwX2RmbV9jMjAwMCwgbj01MCkKYGBgCmBgYHtyfQp0ZXh0c3RhdF9mcmVxdWVuY3koc3BfZGZtX3AyMDAwLCBuPTUwKQpgYGAKCiMjIFBsb3R0aW5nIHdvcmQgZnJlcXVlbmNpZXMKCmBgYHtyfQprbGltYV9wMjAwMCA8LSBkZm1fc2VsZWN0KHNwX2RmbV9wMjAwMCwgcGF0dGVybj0ia2xpbWEqIikKa2xpbWFfYzIwMDAgPC0gZGZtX3NlbGVjdChzcF9kZm1fYzIwMDAsIHBhdHRlcm49ImtsaW1hKiIpCgoKYGBgCgpgYGB7cn0Ka2xpbWFfdGVybXNfcDIwMDAgPC0gdG9wZmVhdHVyZXMoa2xpbWFfcDIwMDAsIG49MTAwKQprbGltYV90ZXJtc19jMjAwMCA8LSB0b3BmZWF0dXJlcyhrbGltYV9jMjAwMCwgbj0xMDApCmBgYAoKYGBge3J9CmZyZXFfcDIwMDAgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KHNwX2RmbV9wMjAwMCwgbj01MCkKZnJlcV9jMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koc3BfZGZtX2MyMDAwLCBuPTUwKQoKcGxvdF9wMjAwMCA8LSB3aXRoKGZyZXFfcDIwMDAsIHJlb3JkZXIoZmVhdHVyZSwgLWZyZXF1ZW5jeSkpCnBsb3RfYzIwMDAgPC0gd2l0aChmcmVxX2MyMDAwLCByZW9yZGVyKGZlYXR1cmUsIC1mcmVxdWVuY3kpKQoKI2NyZWF0ZSBwbG90IGZvciBlaWtlIGtsaW1hIHdvcmRzIGZyZXF1ZW5jaWVzCnBsb3QxIDwtIGdncGxvdChmcmVxX3AyMDAwLCBhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludCgpK2dndGl0bGUoIlAyMDAwIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpCiNnZ3NhdmUocGxvdD1wbG90MSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgZHBpPTMwMCwgZmlsZW5hbWU9ImtsaW1hX2Vpa2VfcGxvdC5qcGVnIiApCnBsb3QxCgojY3JlYXRlIHBsb3QgZm9yIGtsaW1hcmVwb3J0ZXIga2xpbWEgd29yZHMgZnJlcXVlbmNpZXMKcGxvdDIgPC0gZ2dwbG90KGZyZXFfYzIwMDAsIGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5KSkgKyAKICBnZW9tX3BvaW50KCkrIGdndGl0bGUoIkMyMDAwIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpIAogIAojZ2dzYXZlKHBsb3Q9cGxvdDIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9rbGltYXJlcF9wbG90LmpwZWciICkKcGxvdDIKYGBgCiMjIFNhbWUgUGxvdCBmb3IgIktsaW1hIiBXb3JkcwpgYGB7cn0KZnJlcV9rbGltYV9wMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koa2xpbWFfcDIwMDAsIG49NTApCmZyZXFfa2xpbWFfYzIwMDAgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGtsaW1hX2MyMDAwLCBuPTUwKQoKZnJlcV9rbGltYV9wMjAwMCRmZWF0dXJlIDwtIHdpdGgoZnJlcV9rbGltYV9wMjAwMCwgcmVvcmRlcihmZWF0dXJlLCAtZnJlcXVlbmN5KSkKZnJlcV9rbGltYV9jMjAwMCRmZWF0dXJlIDwtIHdpdGgoZnJlcV9rbGltYV9jMjAwMCwgcmVvcmRlcihmZWF0dXJlLCAtZnJlcXVlbmN5KSkKCiNjcmVhdGUgcGxvdCBmb3IgZWlrZSBrbGltYSB3b3JkcyBmcmVxdWVuY2llcwpwbG90MSA8LSBnZ3Bsb3QoZnJlcV9rbGltYV9wMjAwMCwgYWVzKHg9ZmVhdHVyZSwgeT1mcmVxdWVuY3kpKSArIAogIGdlb21fcG9pbnQoKStnZ3RpdGxlKCJQMjAwMCBLbGltYSBGcmVxdWVuY2llcyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEpKQojZ2dzYXZlKHBsb3Q9cGxvdDEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9laWtlX3Bsb3QuanBlZyIgKQpwbG90MQoKI2NyZWF0ZSBwbG90IGZvciBrbGltYXJlcG9ydGVyIGtsaW1hIHdvcmRzIGZyZXF1ZW5jaWVzCnBsb3QyIDwtIGdncGxvdChmcmVxX2tsaW1hX2MyMDAwLCBhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludCgpKyBnZ3RpdGxlKCJDMjAwMCBLbGltYSBGcmVxdWVuY2llcyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEpKSAKICAKI2dnc2F2ZShwbG90PXBsb3QyLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCBkcGk9MzAwLCBmaWxlbmFtZT0ia2xpbWFfa2xpbWFyZXBfcGxvdC5qcGVnIiApCnBsb3QyCmBgYApgYGB7cn0KIyB0byBzYXZlIGxpc3RzIG9mIGtsaW1hLXdvcmRzIAojIHcvbyAiJGZlYXR1cmUiIGl0IHNhdmVzIHRoZSB3aG9sZSB0YWJsZSBhcyB0ZXh0IGZpbGUgKHdpdGggZnJlcXVlbmN5IGluZm8gZXRjLikKI2NhcHR1cmUub3V0cHV0KGxpc3QoZnJlcV9rbGltYV9wMjAwMCRmZWF0dXJlKSwgZmlsZSA9ICJ0ZXJtc19wcm8udHh0IikKI2NhcHR1cmUub3V0cHV0KGxpc3QoZnJlcV9rbGltYV9jMjAwMCRmZWF0dXJlKSwgZmlsZSA9ICJ0ZXJtc19jb250cmEudHh0IikKYGBgCgojIyBQbG90IFRGLUlERiAobm90IHdvcmtpbmcgeWV0ISEhKQpgYGB7cn0KIyB3ZWlnaHRlZCB3b3JkcwpwMjAwMF93ZWlnaHQgPC0gZGZtX3dlaWdodChzcF9kZm1fcDIwMDAsIHNjaGVtZT0icHJvcCIpCmMyMDAwX3dlaWdodCA8LSBkZm1fd2VpZ2h0KHNwX2RmbV9jMjAwMCwgc2NoZW1lPSJwcm9wIikKCnJlbGZyZXFfcDIwMDAgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KHAyMDAwX3dlaWdodCwgbj01MCkKcmVsZnJlcV9jMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koYzIwMDBfd2VpZ2h0LCBuPTUwKQoKI3RmaWRmCnAyMDAwX3RmaWRmIDwtIGRmbV90ZmlkZihzcF9kZm1fcDIwMDAsIHNjaGVtZV90ZiA9ICJwcm9wIikKYzIwMDBfdGZpZGYgPC0gZGZtX3RmaWRmKHNwX2RmbV9jMjAwMCwgc2NoZW1lX3RmID0gInByb3AiKQoKI3Bsb3QzIDwtIHdpdGgocmVsZnJlcV9wMjAwMCwgcmVvcmRlcihmZWF0dXJlLCAtZnJlcWVuY3kpKQpyZWxmcmVxX3AyMDAwJGZlYXR1cmUgPC0gd2l0aChyZWxmcmVxX3AyMDAwLCByZW9yZGVyKGZlYXR1cmUsIC1mcmVxdWVuY3kpKQpwbG90MyA8LSBnZ3Bsb3QocmVsZnJlcV9wMjAwMCwgYWVzKHg9ZmVhdHVyZSwgeT1mcmVxdWVuY3kpKSArIAogIGdlb21fcG9pbnQoKStnZ3RpdGxlKCJQMjAwMCBGcmVxdWVuY2llcyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEpKQojZ2dzYXZlKHBsb3Q9cGxvdDEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9laWtlX3Bsb3QuanBlZyIgKQpwbG90MwpgYGAKCmBgYHtyfQpwcm9fZnJlcV90ZmlkZiA8LSBwMjAwMF90ZmlkZiAlPiUKICB0ZXh0c3RhdF9mcmVxdWVuY3kobj0xMCwgZm9yY2U9VFJVRSkKCmNvbl9mcmVxX3RmaWRmIDwtIGMyMDAwX3RmaWRmICU+JQogIHRleHRzdGF0X2ZyZXF1ZW5jeShuPTEwLCBmb3JjZT1UUlVFKQoKdHBsb3RfdGZpZGZfcDIwMDAgPC0gZ2dwbG90KGRhdGE9cHJvX2ZyZXFfdGZpZGYsCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeD1mYWN0b3IobnJvdyhwcm9fZnJlcV90ZmlkZik6MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgeT1mcmVxdWVuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsKICBjb29yZF9mbGlwKCkgKwogIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWZhY3Rvcihucm93KHByb19mcmVxX3RmaWRmKToxKSwKICAgICAgICAgICAgICAgICAgIGxhYmVscz1wcm9fZnJlcV90ZmlkZiRmZWF0dXJlKSArCiAgbGFicyh4PU5VTEwsIHk9InRmLWlkZiIpCgp0cGxvdF90ZmlkZl9wMjAwMAoKdHBsb3RfdGZpZGZfYzIwMDAgPC0gZ2dwbG90KGRhdGE9Y29uX2ZyZXFfdGZpZGYsCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeD1mYWN0b3IobnJvdyhjb25fZnJlcV90ZmlkZik6MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgeT1mcmVxdWVuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsKICBjb29yZF9mbGlwKCkgKwogIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWZhY3Rvcihucm93KGNvbl9mcmVxX3RmaWRmKToxKSwKICAgICAgICAgICAgICAgICAgIGxhYmVscz1jb25fZnJlcV90ZmlkZiRmZWF0dXJlKSArCiAgbGFicyh4PU5VTEwsIHk9InRmLWlkZiIpCgp0cGxvdF90ZmlkZl9jMjAwMApgYGAKCmBgYHtyfQp0b3BmZWF0dXJlcyhwMjAwMF90ZmlkZiwgbj0yMCkKdG9wZmVhdHVyZXMoYzIwMDBfdGZpZGYsIG49MjApCiNwMjAwMF93ZWlnaHQKCiN0ZXh0c3RhdF9mcmVxdWVuY3kocDIwMDBfdGZpZGYsIG49MTApCmBgYAoKIyMjIENvbXBhcmlzb24gb2YgR3JvdXBzL09yaWdpbgpgYGB7cn0KZGZtX3dlaWdodF9vcmlnaW4gPC0gZnVsbF9jb3JwdXMgJT4lCiAgI2NvcnB1c19zdWJzZXQob3JpZ2luID4gMjAwMCkgJT4lCiAgdG9rZW5zKHJlbW92ZV9wdW5jdCA9IFRSVUUpICU+JQogIHRva2Vuc19yZW1vdmUoZGVfc3RvcHdvcmRzMSkgJT4lCiAgZGZtKCkgJT4lCiAgZGZtX3dlaWdodChzY2hlbWUgPSAicHJvcCIpCgojIENhbGN1bGF0ZSByZWxhdGl2ZSBmcmVxdWVuY3kgYnkgcHJlc2lkZW50CmZyZXFfd2VpZ2h0IDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShkZm1fd2VpZ2h0X29yaWdpbiwgbiA9IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IGRmbV93ZWlnaHRfb3JpZ2luJGdyb3VwKSAjIGNoYW5nZSB0byAib3JpZ2luIiBoZXJlIHRvIHNlZSBmb3IgYWxsIHdlYnNpdGVzIAoKZ2dwbG90KGRhdGEgPSBmcmVxX3dlaWdodCwgYWVzKHggPSBucm93KGZyZXFfd2VpZ2h0KToxLCB5ID0gZnJlcXVlbmN5KSkgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgZmFjZXRfd3JhcCh+IGdyb3VwLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgICBjb29yZF9mbGlwKCkgKwogICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBucm93KGZyZXFfd2VpZ2h0KToxLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBmcmVxX3dlaWdodCRmZWF0dXJlKSArCiAgICAgbGFicyh4ID0gTlVMTCwgeSA9ICJSZWxhdGl2ZSBmcmVxdWVuY3kiKQpgYGAKIyBDb2xsb2NhdGlvbnMKYGBge3J9CiMgdG8gcmVtb3ZlIHNwZWNpYWwgY2hhcnMgZnJvbSBjb3JwdXMKcHJvMjAwMCA8LSBnc3ViKCJcXHwiLCAiIiwgcHJvMjAwMCkKcHJvMjAwMCA8LSBnc3ViKCI9IiwgIiIsIHBybzIwMDApCgojIGNvbnZlcnQgaW50byBjb2xsb2NhdGlvbiBkYXRhZnJhbWUKcF9jb2xsIDwtIHRleHRzdGF0X2NvbGxvY2F0aW9ucyhwcm8yMDAwLCBtaW5fY291bnQ9NTApCmFycmFuZ2UocF9jb2xsLCBkZXNjKGNvdW50KSkKYGBgCmBgYHtyfQojIHRyYW5zZm9ybSBzdG9wbGlzdHMgZm9yIGRwbHlyOjpmaWx0ZXIgZnVuY3Rpb24gKHdoeT8pCmRlX3N0cHMgPC0gcGFzdGUwKGRlX3N0b3B3b3JkcywgY29sbGFwc2UgPSAiXFxifFxcYiIpCmVuX3N0cHMgPC0gcGFzdGUwKGVuX3N0b3B3b3JkcywgY29sbGFwc2UgPSAiXFxifFxcYiIpCgojIHJlbW92ZSBlbnRyaWVzIGludm9sdmluZyBzdG9wd29yZHM6IE5PVCBXT1JLSU5HIFlFVCEKcDIwMDBfY29sbF9jbGVhbiA8LSBwX2NvbGwgJT4lCiAgZHBseXI6OmZpbHRlcighc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgZGVfc3RwcyksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgZW5fc3RwcyksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIj0iKSkKCiNwMjAwMF9jb2xsX2NsZWFuCmFycmFuZ2UocDIwMDBfY29sbF9jbGVhbiwgZGVzYyhjb3VudCkpCmBgYAoKYGBge3J9CiMgY29sbG9jYXRpb25zIG1pdCB2b3JoZXJpZ2VtIHN0b3B3b3JkcyByZW1vdmFsOiBub3Qgd29ya2luZwpwMjAwMF90b2tzIDwtIHRva2Vucyhwcm8yMDAwKQpwMjAwMF90b2tzX3N3IDwtIHRva2Vuc19zZWxlY3QocDIwMDBfdG9rcywgcGF0dGVybj1mdWxsX3N0b3B3b3Jkcywgc2VsZWN0aW9uPSJyZW1vdmUiKQoKcDIwMDBfY29sbCA8LSB0ZXh0c3RhdF9jb2xsb2NhdGlvbnMocDIwMDBfdG9rc19zdywgbWluX2NvdW50PTMpCmFycmFuZ2UocDIwMDBfY29sbCwgZGVzYyhjb3VudCkpCmBgYApgYGB7cn0Kc3VtbWFyeShmdWxsX2NvcnB1cywgbj01KQpgYGAKCiMjIENvbXBhcmlzb24gUGxvdHMKYGBge3J9CiNjcmVhdGUgaW5wdXQKY29ycCA8LSBkZm0oZnVsbF9jb3JwdXMpCgojIGxlbW1hdGlzaWVydW5nIHZlcnN1Y2hlbjoKCgoKZGVfa2xpbWEgPC0gZGZtX3NlbGVjdChjb3JwLCBwYXR0ZXJuID0ia2xpbWEqIikKZGVfcmVsZnJlcSA8LSBkZm1fd2VpZ2h0KGRlX2tsaW1hLCBzY2hlbWU9InByb3AiKQpkZV9mcmVxcyA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koZGVfcmVsZnJlcSwgZ3JvdXBzPWdyb3VwKQoKI3Bsb3R0aW5nIApmcmVxcy5hY3QgPC0gZmlsdGVyKGRlX2ZyZXFzLCBncm91cCA9PSAiYWN0aXZpc3RzIikgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgc2VsZWN0KGZlYXR1cmUsIGZyZXF1ZW5jeSkKZnJlcXMuc2NlcHQgPC0gZmlsdGVyKGRlX2ZyZXFzLCBncm91cCA9PSAic2NlcHRpY3MiKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBzZWxlY3QoZmVhdHVyZSwgZnJlcXVlbmN5KQpmcmVxcyA8LSBsZWZ0X2pvaW4oZnJlcXMuYWN0LCBmcmVxcy5zY2VwdCwgYnkgPSAiZmVhdHVyZSIpICU+JSBoZWFkKDMwKSAlPiUgYXJyYW5nZShmcmVxdWVuY3kueCkgJT4lIG11dGF0ZShmZWF0dXJlID0gZmFjdG9yKGZlYXR1cmUsIGZlYXR1cmUpKQpnZ3Bsb3QoZnJlcXMpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9ZmVhdHVyZSwgeGVuZD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS54LCB5ZW5kPWZyZXF1ZW5jeS55KSwgY29sb3I9ImdyZXkiKSArCiAgZ2VvbV9wb2ludChhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS54KSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDMgKSArCiAgZ2VvbV9wb2ludChhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS55KSwgY29sb3IgPSAibGlnaHRibHVlIiwgc2l6ZSA9IDMgKSArCiAgZ2d0aXRsZSgiV29yZCBGcmVxdWVuY2llcyIpICsgCiAgeGxhYigiIikgKyB5bGFiKCJXb3J0ZnJlcXVlbnoiKSArIAogIGNvb3JkX2ZsaXAoKQoKZnJlcXMuYWN0IApmcmVxcy5zY2VwdApgYGAKYGBge3J9CgpkZV9rbGltYV9wcm8gPC0gZGZtX3NlbGVjdChzcF9wcm8yMDAwX2RmbSwgcGF0dGVybiA9ImtsaW1hKiIpCmRlX3JlbGZyZXFfcHJvIDwtIGRmbV93ZWlnaHQoZGVfa2xpbWFfcHJvLCBzY2hlbWU9InByb3AiKQpkZV9mcmVxc19wcm8gPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGRlX3JlbGZyZXFfcHJvKQoKZGVfa2xpbWFfY29uIDwtIGRmbV9zZWxlY3Qoc3BfY29uMjAwMF9kZm0sIHBhdHRlcm4gPSJrbGltYSoiKQpkZV9yZWxmcmVxX2NvbiA8LSBkZm1fd2VpZ2h0KGRlX2tsaW1hX2Nvbiwgc2NoZW1lPSJwcm9wIikKZGVfZnJlcXNfY29uIDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShkZV9yZWxmcmVxX2NvbikKCgojcGxvdHRpbmcgCmZyZXFzLmFjdCA8LSBmaWx0ZXIoZGVfZnJlcXNfcHJvKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBzZWxlY3QoZmVhdHVyZSwgZnJlcXVlbmN5KQpmcmVxcy5zY2VwdCA8LSBmaWx0ZXIoZGVfZnJlcXNfY29uKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBzZWxlY3QoZmVhdHVyZSwgZnJlcXVlbmN5KQpmcmVxcyA8LSBsZWZ0X2pvaW4oZnJlcXMuYWN0LCBmcmVxcy5zY2VwdCwgYnkgPSAiZmVhdHVyZSIpICU+JSBoZWFkKDMwKSAlPiUgYXJyYW5nZShmcmVxdWVuY3kueCkgJT4lIG11dGF0ZShmZWF0dXJlID0gZmFjdG9yKGZlYXR1cmUsIGZlYXR1cmUpKQpwIDwtIGdncGxvdChmcmVxcykgKwogICAgZ2VvbV9zZWdtZW50KGFlcyh4PWZlYXR1cmUsIHhlbmQ9ZmVhdHVyZSwgeT1mcmVxdWVuY3kueCwgeWVuZD1mcmVxdWVuY3kueSksIGNvbG9yPSJncmV5IikgKwogICAgZ2VvbV9wb2ludChhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS54LCBjb2xvdXI9IkFjdGl2aXN0cyIpLCBzaXplID0gMykgKwogICAgZ2VvbV9wb2ludChhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS55LCBjb2xvdXI9IlNjZXB0aWNzIiksIHNpemUgPSAzICkgKwogICAgZ2d0aXRsZSgiV29yZCBGcmVxdWVuY2llcyIpICsgCiAgICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgIGNvb3JkX2ZsaXAoKQoKcCtsYWJzKGNvbG91cj0iR3JvdXAiKQoKYGBgCgoKYGBge3J9CiMgdG8gZ2V0IGxlbW1hdGl6ZWQgZGZtIApzcF9wcm8yMDAwX2RmbSA8LSBhcy50b2tlbnMoc3BfcHJvMjAwMCkgJT4lCiAgZGZtKCkKCnNwX2NvbjIwMDBfZGZtIDwtIGFzLnRva2VucyhzcF9jb250cmEyMDAwKSAlPiUKICBkZm0oKQoKYGBgCgoKCmBgYHtyfQpkZm1fd2VpZ2h0X2NvcnAgPC0gZnVsbF9jb3JwdXMgJT4lCiAgdG9rZW5zKHJlbW92ZV9wdW5jdCA9IFRSVUUpICU+JQogIHRva2Vuc19yZW1vdmUoZGVfc3RvcHdvcmRzMSkgJT4lCiAgZGZtKCkgJT4lCiAgZGZtX3dlaWdodChzY2hlbWUgPSAicHJvcCIpCgojIENhbGN1bGF0ZSByZWxhdGl2ZSBmcmVxdWVuY3kgYnkgcHJlc2lkZW50CmZyZXFfd2VpZ2h0IDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShkZm1fd2VpZ2h0X2NvcnAsIG4gPSAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBkZm1fd2VpZ2h0X2NvcnAkb3JpZ2luKQoKZ2dwbG90KGRhdGEgPSBmcmVxX3dlaWdodCwgYWVzKHggPSBucm93KGZyZXFfd2VpZ2h0KToxLCB5ID0gZnJlcXVlbmN5KSkgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgZmFjZXRfd3JhcCh+IGdyb3VwLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgICBjb29yZF9mbGlwKCkgKwogICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBucm93KGZyZXFfd2VpZ2h0KToxLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBmcmVxX3dlaWdodCRmZWF0dXJlKSArCiAgICAgbGFicyh4ID0gTlVMTCwgeSA9ICJSZWxhdGl2ZSBmcmVxdWVuY3kiKQpgYGAKYGBge3J9CnN1bW1hcnkoZnVsbF9jb3JwdXMsIG49MTApCmBgYAoKIyMgS2V5bmVzcwpgYGB7cn0KIyBDcmVhdGUgYSBkZm0gZ3JvdXBlZCBieSBwcmVzaWRlbnQKY29ycF9kZm0gPC0gdG9rZW5zKGZ1bGxfY29ycHVzLCByZW1vdmVfcHVuY3QgPSBUUlVFKSAlPiUKICB0b2tlbnNfcmVtb3ZlKGRlX3N0b3B3b3JkczEpICU+JQogIHRva2Vuc19ncm91cChncm91cHMgPSBncm91cCkgJT4lCiAgZGZtKCkKCiMgQ2FsY3VsYXRlIGtleW5lc3MgYW5kIGRldGVybWluZSBUcnVtcCBhcyB0YXJnZXQgZ3JvdXAKcmVzdWx0X2tleW5lc3MgPC0gdGV4dHN0YXRfa2V5bmVzcyhjb3JwX2RmbSwgdGFyZ2V0ID0gImFjdGl2aXN0cyIpCgojIFBsb3QgZXN0aW1hdGVkIHdvcmQga2V5bmVzcwp0ZXh0cGxvdF9rZXluZXNzKHJlc3VsdF9rZXluZXNzLCBtYXJnaW49MC4yLCBuPTEwKSAKYGBgCiMjIENvbXBhcmlzb24gQ2xvdWQKYGBge3J9CmZ1bGxfY29ycHVzICU+JQogICAgdG9rZW5zKHJlbW92ZV9wdW5jdCA9IFRSVUUsIHJlbW92ZV9udW1iZXJzPVRSVUUpICU+JQogICAgdG9rZW5zX3JlbW92ZShkZV9zdG9wd29yZHMxKSAlPiUKICAgIGRmbSgpICU+JQogICAgZGZtX2dyb3VwKGdyb3VwcyA9IGdyb3VwKSAlPiUKICAgIGRmbV90cmltKG1pbl90ZXJtZnJlcSA9IDUsIHZlcmJvc2UgPSBGQUxTRSkgJT4lCiAgICB0ZXh0cGxvdF93b3JkY2xvdWQoY29tcGFyaXNvbiA9IFRSVUUsIG1heF93b3Jkcz0xMDApCiAgICAgICAgICAgICAgICAgICAgICAgIyxjb2xvcj1jKCJsaWdodGJsdWUiLCJibHVlIikpCmBgYApgYGB7cn0KdGV4dHBsb3RfeHJheSgKICAgIGt3aWModG9rZW5zKHBybzIwMDApLCBwYXR0ZXJuID0gImtsaW1hKiIpLAogICAga3dpYyh0b2tlbnMoY29udHJhMjAwMCksIHBhdHRlcm4gPSAia2xpbWEqIikpCmBgYAojIFRvcGljIE1vZGVsaW5nCmBgYHtyfQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpgYGAKCmBgYHtyfQpkZm1fZnVsbCA8LSBkZm0oZnVsbF9jb3JwdXMsIHJlbW92ZT1kZV9zdG9wd29yZHMxLCByZW1vdmVfcHVuY3Q9VFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSkKZGZtX2Z1bGwKCnRtX2Z1bGw8LWNvbnZlcnQoZGZtX2Z1bGwsIHRvPSJ0b3BpY21vZGVscyIpCgp0b3BpY01vZGVsIDwtIExEQSh0bV9mdWxsLCBrPTUsIG1ldGhvZD0iR2liYnMiLCBjb250cm9sPWxpc3QoaXRlciA9IDUwMCwgdmVyYm9zZSA9IDI1KSkKdGVybXModG9waWNNb2RlbCwgMTApCmBgYAoKCmBgYHtyfQphcF9sZGEgPC0gTERBKHRtX2Z1bGwsIGs9NSwgY29udHJvbD1saXN0KHNlZWQ9MTIzNCkpCgphcF90b3BpY3MgPC0gdGlkeShhcF9sZGEsIG1hdHJpeD0iYmV0YSIpCgphcF9sZGEKCgphcF90b3BfdGVybXMgPC0gYXBfdG9waWNzICU+JQogIGdyb3VwX2J5KHRvcGljKSAlPiUKICBzbGljZV9tYXgoYmV0YSwgbiA9IDEwKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UodG9waWMsIC1iZXRhKQoKYXBfdG9wX3Rlcm1zICU+JQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcl93aXRoaW4odGVybSwgYmV0YSwgdG9waWMpKSAlPiUKICBnZ3Bsb3QoYWVzKGJldGEsIHRlcm0sIGZpbGwgPSBmYWN0b3IodG9waWMpKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH4gdG9waWMsIHNjYWxlcyA9ICJmcmVlIikgKwogIHNjYWxlX3lfcmVvcmRlcmVkKCkKCmBgYAotIHRyeSBsZW1tYXRpemVkIHZlcnNpb24gZm9yIHRvcGljIG1vZGVsaW5nIAoKCklkZWFzOgpET05FOiBXb3JkY2xvdWQgUGxvdCBvZiBDb21wYXJpc29uIEdyb3VwOgogICAgICBodHRwczovL3F1YW50ZWRhLmlvL2FydGljbGVzL3BrZ2Rvd24vZXhhbXBsZXMvcGxvdHRpbmcuaHRtbAoKTGV4aWNhbCBEaXNwZXJzaW9uIFBsb3QgKFgtUmF5KQotPiBjb3VsZCBiZSBkb25lIGZvciBrZXl3b3JkcyAia2xpbWEqIgoKTmV4dDoKLSBDYWxjdWxhdGUgIkNvcnB1cyBTaW1pbGFyaXR5IgotIEtsaW1hd8O2cnRlciBMaXN0ZSBtaXQgR3JvdXAgdW5kIENvdW50cyBhYnNwZWljaGVybiAtPiB3ZWxjaGUgS2xpbWF3w7ZydGVyIGdpYnQgZXMgd28gdW5kIHdpZSBvZnQKLSBhbGxlcyBtaXQgZGVyICJTZW50cyIgVmVyc2lvbiB0ZXN0ZW4KLSBBbmFseXNlIGRlciBFcmdlYm5pc3NlCi0gTGl0ZXJhdHVyLVJlY2hlcmNoZSB6dSBkZW4gVGV4dG1pbmluZyBUaGVtZW4KClRvcGljIE1vZGVsaW5nCmh0dHBzOi8vd3d3LnRpZHl0ZXh0bWluaW5nLmNvbS90b3BpY21vZGVsaW5nLmh0bWwKCgoKCgo=